// src/services/websocket.js
let socket = null;
let listeners = []; // 事件监听器
let reconnectTimer = null;
let reconnectAttempts = 0;
const MAX_RECONNECT = 5; // 最大重连次数
const RECONNECT_DELAY = 3000; // 重连间隔（毫秒）



// 连接状态常量（统一状态标识）
export const WS_STATE = {
  CONNECTED: 'connected',
  CONNECTING: 'connecting',
  DISCONNECTED: 'disconnected'
};

/**
 * 初始化WebSocket连接（单例模式）
 * @param {string} token - 用户认证token
 * @param {string} userType - 用户类型
 */
export const initWs = (token, userType) => {

  if (socket) return; // 已连接则不重复创建

  try {
    console.log('初始化WebSocket连接');
    const rolePath = userType === 'recruiter' ? 'recruiter' : 'seeker';
    // 替换为你的实际WebSocket地址（注意用wss://生产环境）
    const wsUrl = `ws://120.26.233.80:8084/message/${rolePath}?token=${token}`;
    console.log(wsUrl);
    socket = new WebSocket(wsUrl);
    emit('stateChange', WS_STATE.CONNECTING); // 触发"状态变化"事件

    // 连接成功
    socket.onopen = () => {
      reconnectAttempts = 0; // 重置重连次数
      emit('stateChange', WS_STATE.CONNECTED);
      emit('systemMessage', '系统: 连接已建立');
    };

    // 接收消息（转发给监听器）
    socket.onmessage = (event) => {
      try {
        // 1. 预处理消息：给数字键添加双引号，修复JSON格式
        const fixedData = event.data.replace(/([{,]\s*)(\d+)(\s*:)/g, '$1"$2"$3');

        // 2. 解析修复后的JSON
        const data = JSON.parse(fixedData);

        emit('message', data); // 触发"消息接收"事件
      } catch (err) {
        emit('systemMessage', `系统: 消息解析错误 - ${event.data}`);
        console.error('消息解析失败:', err);
      }
    };

    // 连接关闭（自动重连）
    socket.onclose = (event) => {
      console.log('WebSocket关闭', event.code);
      socket = null; // 重置连接实例
      emit('stateChange', WS_STATE.DISCONNECTED);
      emit('systemMessage', `系统: 连接已关闭 (${event.code})`);
      scheduleReconnect(token); // 触发重连
    };

    // 连接错误
    socket.onerror = (err) => {
      console.error('WebSocket错误', err);
      emit('systemMessage', `系统: 连接错误 - ${err.message || err.type}`);
    };

  } catch (err) {
    emit('stateChange', WS_STATE.DISCONNECTED);
    emit('systemMessage', `系统: 初始化失败 - ${err.message}`);
    scheduleReconnect(token);
  }
};

/**
 * 发送消息
 * @param {Object} message - 消息对象（需符合后端格式）
 */
export const sendWsMessage = (message) => {
  if (socket && socket.readyState === WebSocket.OPEN) {
    socket.send(JSON.stringify(message));
  } else {
    emit('systemMessage', '系统: 发送失败 - 未连接到服务器');
  }
};

/**
 * 关闭连接
 */
export const closeWs = () => {
  if (socket) {
    socket.close();
    socket = null;
    clearTimeout(reconnectTimer); // 关闭时停止重连
  }
};

/**
 * 事件监听（供Vuex/组件订阅消息）
 * @param {string} event - 事件名（stateChange/message/systemMessage）
 * @param {Function} callback - 回调函数
 */
export const onWsEvent = (event, callback) => {
  listeners.push({ event, callback });
};

/**
 * 移除事件监听（避免内存泄漏）
 * @param {string} event - 事件名
 * @param {Function} callback - 回调函数
 */
export const offWsEvent = (event, callback) => {
  listeners = listeners.filter(item => !(item.event === event && item.callback === callback));
};

// 内部：触发事件
const emit = (event, data) => {
  listeners.forEach(item => {
    if (item.event === event) item.callback(data);
  });
};

// 内部：重连逻辑
const scheduleReconnect = (token) => {
  if (reconnectAttempts < MAX_RECONNECT) {
    reconnectAttempts++;
    clearTimeout(reconnectTimer);
    reconnectTimer = setTimeout(() => {
      console.log(`重连尝试 ${reconnectAttempts}/${MAX_RECONNECT}`);
      initWs(token); // 用原token重连
    }, RECONNECT_DELAY * reconnectAttempts); // 指数退避重连（间隔递增）
  }
};

export const getSocketInstance = () => socket;